#include <mqueue.h>
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>

static char *mq_name = "/test_mq";  // 在/dev/mqueue下
static mqd_t mq_fd; // 队列描述符   fd: file descriptor


// first线程函数
void *first_thread_fun(void *arg) {

    // sleep(1);  // 证明：可以异步接收消息

    printf("first线程开始执行，准备收消息 \n");
    // 接收消息
    char buf[101]; // 接收消息的容器长度不能小于配置最大长度
    ssize_t len = mq_receive(mq_fd, buf, sizeof(buf), NULL);
    printf("接收到消息：%s, 长度：%ld \n", buf, len);

    return NULL;
}

// second线程函数
void *second_thread_fun(void *arg) {
    sleep(3);

    printf("second线程开始执行, 准备发消息 \n");
    // 发送消息
    mq_send(mq_fd, "hello", 6, 0);

    return NULL;
}

int main(int argc, char const *argv[])
{
     printf("main线程开始执行 \n");

    // 创建/打开队列
    struct mq_attr attr;
    attr.mq_maxmsg = 10; // 最大消息数
    attr.mq_msgsize = 100; // 每条消息的最大字节数
    mq_fd = mq_open(mq_name, O_RDWR | O_CREAT, 0644, &attr);
    if (mq_fd == -1) {
        printf("创建队列失败 \n");
        return -1;
    }

   

    // 创建2个分线程
    pthread_t pt1, pt2;  // 线程标识 unsigned long
    pthread_create(&pt1, NULL, first_thread_fun, NULL);
    pthread_create(&pt2, NULL, second_thread_fun, NULL);
    // 等待2个分线程执行完毕
    pthread_join(pt1, NULL);
    pthread_join(pt2, NULL);

    printf("main线程即将结束执行 \n");

    // 关闭队列
    mq_close(mq_fd);
    // 删除队列
    mq_unlink(mq_name);

    return 0;
}
